package Negocio;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;
import java.util.Date;

import org.omg.CORBA.INTERNAL;

import Persistencia.AdministradorPersistenciaFactura;
import Persistencia.AdministradorPersistenciaUsuario;

public class Factura implements Observable {


	private Vector <ItemFactura> items;
	private int numero;
	private float total;
	private Date periodo;
	private Date fechaVencimiento;
	private String estado;
	private static int id = 0;
	private Linea linea;
	private Usuario usuario;
	
	
	//Inicio PR - Constructor
	public Factura(Date periodo) {
		this.numero = Factura.id++;
		this.periodo = periodo;
		this.fechaVencimiento = this.vencimiento(periodo);
		this.estado = "Impaga";
		this.items = new Vector<ItemFactura>();
		this.total = 0;
		
		AdministradorPersistenciaFactura.getInstancia().insertFactura(this);
	}
	//Fin PR - Constructor
	
	//Calcular Fecha de Vencimiento
	private Date vencimiento(Date p){
		Calendar c = Calendar.getInstance();
		c.setTime(periodo);
		c.add(Calendar.DAY_OF_YEAR, 15);
		return c.getTime();
	}
	
	//Crear nuevo ItemFactura y agregarlo a la collection
	public void nuevoItemFactura(int cant, float pretot, String serv){
		ItemFactura i;
		int numItem = items.size() + 1;
		i = new ItemFactura(serv, numItem, pretot, cant);
		items.add(i);
		
		AdministradorPersistenciaFactura.getInstancia().insertItemFactura(this.numero, i);
	}

	public Vector<ItemFactura> getItems() {
		return items;
	}

	public void setItems(Vector<ItemFactura> items) {
		this.items = items;
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
	}

	public float getTotal() {
		return total;
	}

	public void setTotal(float total) {
		this.total = total;
	}

	public Date getPeriodo() {
		return periodo;
	}

	public void setPeriodo(Date periodo) {
		this.periodo = periodo;
	}

	public Date getFechaVencimiento() {
		return fechaVencimiento;
	}

	public void setFechaVencimiento(Date fechaVencimiento) {
		this.fechaVencimiento = fechaVencimiento;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public static int getId() {
		return id;
	}

	public static void setId(int id) {
		Factura.id = id;
	}

	public Linea getLinea() {
		return linea;
	}

	public void setLinea(Linea linea) {
		this.linea = linea;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}
	
	public Factura(Vector<ItemFactura> items, int numero, float total,
			Date periodo, Date fechaVencimiento, String estado, Linea linea,
			Usuario usuario) {
		super();
		this.items = items;
		this.numero = numero;
		this.total = total;
		this.periodo = periodo;
		this.fechaVencimiento = fechaVencimiento;
		this.estado = estado;
		this.linea = linea;
		this.usuario = usuario;
		if (usuario.getMail()!=null)
			notifyAll(this); // si el usuario al cual la factura se relaciona posee mail, se llama a notifyAll para envio de factura por mail
	}
	
	public FacturaView getView(){
		DateFormat dfDateMedium = DateFormat.getDateInstance(DateFormat.MEDIUM);
		String fechaVenc = dfDateMedium.format(getFechaVencimiento());
		String periodo = dfDateMedium.format(getPeriodo());
		return new FacturaView(Integer.toString(numero), linea.getNumero(), fechaVenc, periodo, Float.toString(total), estado);
	}
	
	@Override
	public void addObserver(Observer o)
	{
		observers.add(o);
		
	}

	@Override
	public void notifyAll(Factura f) 
	{
	     for (int i=0;i<observers.size();i++)
	    	 observers.elementAt(i).notify(f);
		
	}

	@Override
	public void removeObserver(Observer o) 
	{
		observers.remove(o);
		
	}

	
}
